package dao;

import java.util.ArrayList;
import java.util.List;
import model.Acao;
import model.UsuarioGrupo;
import model.UsuarioGrupoAcao;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import util.CustomException;

/**
 *
 * @author rodolpho
 */
public class UsuarioGrupoAcaoDAO extends GenericEntityDAO<UsuarioGrupoAcao, Long> {

    public List<UsuarioGrupoAcao> selecionarPorUsuarioGrupo(Session session, UsuarioGrupo usuarioGrupo) throws CustomException {
        List<UsuarioGrupoAcao> usuarioGrupoAcaoList = new ArrayList();
        try {
            Criteria criteria = session.createCriteria(UsuarioGrupoAcao.class, "usuarioGrupoAcao");
            criteria.createAlias("usuarioGrupoAcao.acao", "acao"); // INNER JOIN ACAO
            criteria.createAlias("acao.acaoGrupo", "acaoGrupo"); // INNER JOIN ACAO_GRUPO
            criteria.createAlias("usuarioGrupoAcao.usuarioGrupo", "usuarioGrupo"); // INNER JOIN USUARIO_GRUPO
            criteria.add(Restrictions.eq("usuarioGrupo.ugrCodigo", usuarioGrupo.getUgrCodigo()));
            criteria.add(Restrictions.eq("acao.acaoAtivo", Boolean.TRUE));
            criteria.add(Restrictions.eq("acaoGrupo.agrAtivo", Boolean.TRUE));
            usuarioGrupoAcaoList.addAll(criteria.list());

            List<Long> acaoCodigoList = new ArrayList();
            for (UsuarioGrupoAcao usuarioGrupoAcao : usuarioGrupoAcaoList) {
                acaoCodigoList.add(usuarioGrupoAcao.getAcao().getAcaoCodigo());
            }

            criteria = session.createCriteria(Acao.class, "acao");
            criteria.createAlias("acao.acaoGrupo", "acaoGrupo"); // INNER JOIN ACAO_GRUPO
            if (!acaoCodigoList.isEmpty()) {
                criteria.add(Restrictions.not(Restrictions.in("acaoCodigo", acaoCodigoList)));
            }
            criteria.add(Restrictions.eq("acao.acaoAtivo", Boolean.TRUE));
            criteria.add(Restrictions.eq("acaoGrupo.agrAtivo", Boolean.TRUE));

            List<Acao> acaoList = criteria.list();
            for (Acao acao : acaoList) {
                usuarioGrupoAcaoList.add(new UsuarioGrupoAcao(0, usuarioGrupo, acao, Boolean.FALSE));
            }
        } catch (Exception e) {
            throw new CustomException("Falha ao selecionar ações do grupo.", e);
        }
        return usuarioGrupoAcaoList;
    }

    public List<UsuarioGrupoAcao> selecionarPorNovoUsuarioGrupo(Session session, UsuarioGrupo usuarioGrupo) throws CustomException {
        List<UsuarioGrupoAcao> usuarioGrupoAcaoList = new ArrayList();
        try {
            Criteria criteria = session.createCriteria(Acao.class, "acao");
            criteria.createAlias("acao.acaoGrupo", "acaoGrupo"); // INNER JOIN ACAO_GRUPO
            criteria.add(Restrictions.eq("acao.acaoAtivo", Boolean.TRUE));
            criteria.add(Restrictions.eq("acaoGrupo.agrAtivo", Boolean.TRUE));
            criteria.addOrder(Order.asc("agrNome"));
            criteria.addOrder(Order.asc("acaoDescricao"));
            List<Acao> acaoList = criteria.list();
            for (Acao acao : acaoList) {
                usuarioGrupoAcaoList.add(new UsuarioGrupoAcao(0, usuarioGrupo, acao, Boolean.FALSE));
            }
        } catch (Exception e) {
            throw new CustomException("Falha ao selecionar ações do grupo.", e);
        }
        return usuarioGrupoAcaoList;
    }
}
